package org.fujay.langchain4jserver.domain.knowledge.repository;

import org.fujay.langchain4jserver.domain.knowledge.aggregate.KnowledgeBaseAggregate;
import org.fujay.langchain4jserver.domain.knowledge.vo.FileId;
import org.fujay.langchain4jserver.domain.knowledge.vo.KnowledgeBaseId;
import org.fujay.langchain4jserver.domain.model.vo.ModelId;

import java.util.List;
import java.util.Optional;

/**
 * 知识库仓储接口
 */
public interface KnowledgeBaseRepository {

    /**
     * 保存知识库聚合根（包含其内部文件状态）
     *
     * @param aggregate 知识库聚合根
     */
    void save(KnowledgeBaseAggregate aggregate);

    /**
     * 根据ID查找知识库聚合根（包含文件列表）
     *
     * @param id 知识库ID
     * @return 知识库聚合根 Optional
     */
    Optional<KnowledgeBaseAggregate> findById(KnowledgeBaseId id);

    /**
     * 获取知识库概要信息
     */
    Optional<KnowledgeBaseAggregate> findByIdShallow(KnowledgeBaseId id);

    /**
     * 获取知识库向量模型
     */
    Optional<ModelId> findEmbeddingModelId(KnowledgeBaseId id);

    Optional<KnowledgeBaseAggregate> findByIdAndFile(KnowledgeBaseId id, FileId fileId);

    /**
     * 根据ID删除知识库（需要处理关联的文件和向量）
     *
     * @param id 知识库ID
     */
    void deleteById(KnowledgeBaseId id);

    /**
     * 查找所有知识库（通常只加载基础信息，不加载文件）
     *
     * @return 知识库聚合根列表
     */
    List<KnowledgeBaseAggregate> findAllShallow();

    /**
     * 查找已完成索引的知识库
     *
     * @return 知识库列表 (可能是不完整的聚合)
     */
    List<KnowledgeBaseAggregate> findCompleted();

    /**
     * 检查索引名称是否已存在
     *
     * @param indexName 索引名称
     * @return true 如果存在, false 否则
     */
    boolean existsByIndexName(String indexName);
}
